8184. Треугольник

Определите, можно ли получить два треугольника с заданными длинами сторон, разрезав некоторый прямоугольник одним разрезом и свободно вращая и переворачивая полученные куски.

 

Вход. Состоит из двух строк. Первая строка содержит три натуральных числа – длины сторон первого треугольника. Вторая строка содержит три натуральных числа – длины сторон второго треугольника. Известно, что треугольники являются корректными. Все длины сторон не более 100.

 

Выход. Сообщить, существует ли прямоугольник, который можно было бы разрезать на треугольники с заданными длинами сторон. Если такой прямоугольник существует, выведите YES. В противном случае выведите NO.

 

Пример входа 1

Пример выхода 1

3 4 5

4 3 5

YES

 

 

Пример входа 2

Пример выхода 2

3 4 6

4 6 3

NO

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

Пусть a, b, c – длины сторон первого треугольника, d, e, f – длины сторон второго треугольника. Отсортируем стороны треугольников так чтобы выполнялись неравенства abc и def. Из двух треугольников можно сложить прямоугольник только если их соответствующие стороны попарно равны (a = d, b = e, c = f) и если оба треугольника являются прямоугольными (a2 + b2 = c2, d2 + e2 = f2).

 

Реализация алгоритма

Читаем входные данные.

 

scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);

 

Упорядочим длины сторон первого треугольника так чтобы abc.

 

if (a > c) swap(a, c);

if (b > c) swap(b, c);

if (a > b) swap(a, b);

 

Упорядочим длины сторон второго треугольника так чтобы def.

 

if (d > f) swap(d, f);

if (e > f) swap(e, f);

if (d > e) swap(d, e);

 

Выводим YES, если соответствующие стороны треугольников попарно равны и треугольники прямоугольные.

 

if (a == d && b == e && c == f && a*a + b*b == c*c) printf("YES\n");

else printf("NO\n");